quarkus 作為一個和雲端服務整合度很高的後端框架
裡面也有很多的套件可以協助後端和雲端服務進行整合
我們先安裝 quarkus 裡面和 kubernetes 相關的幾個套件
implementation 'io.quarkus:quarkus-kubernetes'
implementation 'io.quarkus:quarkus-smallrye-health'
implementation 'io.quarkus:quarkus-kubernetes-config'
安裝好之後,我們運行
gradle build
運作完畢之後,可以看到在 build/kubernetes/kubernetes.yml
裡面,已經有建立好的 k8s 腳本了
---
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
app.quarkus.io/quarkus-version: 3.24.2
app.quarkus.io/commit-id: 2fdfe2d27eab14a683174c2dceb1997f00c88252
app.quarkus.io/vcs-uri: https://github.com/flamerecca/quarkus2025.git
app.quarkus.io/build-timestamp: 2025-09-20 - 15:18:55 +0000
labels:
app.kubernetes.io/name: quarkus2025
app.kubernetes.io/version: 1.0.0-SNAPSHOT
app.kubernetes.io/managed-by: quarkus
name: quarkus2025
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
app.kubernetes.io/name: quarkus2025
app.kubernetes.io/version: 1.0.0-SNAPSHOT
name: quarkus2025-view
roleRef:
kind: ClusterRole
apiGroup: rbac.authorization.k8s.io
name: view
subjects:
- kind: ServiceAccount
name: quarkus2025
---
apiVersion: v1
kind: Service
metadata:
annotations:
app.quarkus.io/quarkus-version: 3.24.2
app.quarkus.io/commit-id: 2fdfe2d27eab14a683174c2dceb1997f00c88252
app.quarkus.io/vcs-uri: https://github.com/flamerecca/quarkus2025.git
app.quarkus.io/build-timestamp: 2025-09-20 - 15:18:55 +0000
labels:
app.kubernetes.io/name: quarkus2025
app.kubernetes.io/version: 1.0.0-SNAPSHOT
app.kubernetes.io/managed-by: quarkus
name: quarkus2025
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
selector:
app.kubernetes.io/name: quarkus2025
app.kubernetes.io/version: 1.0.0-SNAPSHOT
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
app.quarkus.io/quarkus-version: 3.24.2
app.quarkus.io/commit-id: 2fdfe2d27eab14a683174c2dceb1997f00c88252
app.quarkus.io/vcs-uri: https://github.com/flamerecca/quarkus2025.git
app.quarkus.io/build-timestamp: 2025-09-20 - 15:18:55 +0000
labels:
app.kubernetes.io/name: quarkus2025
app.kubernetes.io/version: 1.0.0-SNAPSHOT
app.kubernetes.io/managed-by: quarkus
name: quarkus2025
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: quarkus2025
app.kubernetes.io/version: 1.0.0-SNAPSHOT
template:
metadata:
annotations:
app.quarkus.io/quarkus-version: 3.24.2
app.quarkus.io/commit-id: 2fdfe2d27eab14a683174c2dceb1997f00c88252
app.quarkus.io/vcs-uri: https://github.com/flamerecca/quarkus2025.git
app.quarkus.io/build-timestamp: 2025-09-20 - 15:18:55 +0000
labels:
app.kubernetes.io/managed-by: quarkus
app.kubernetes.io/name: quarkus2025
app.kubernetes.io/version: 1.0.0-SNAPSHOT
spec:
containers:
- env:
- name: KUBERNETES_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
image: docker.io/reccachao/hello-quarkus:1.0.0-SNAPSHOT
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
httpGet:
path: /q/health/live
port: 8080
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
name: quarkus2025
ports:
- containerPort: 8080
name: http
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /q/health/ready
port: 8080
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
startupProbe:
failureThreshold: 3
httpGet:
path: /q/health/started
port: 8080
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
serviceAccountName: quarkus2025
另外,當我們運作專案時
quarkus dev
會看到在 http://127.0.0.1:8080/q/health/live 已經由套件建立好
{
"status": "UP",
"checks": [
]
}
還有 http://127.0.0.1:8080/q/health/ready
{
"status": "UP",
"checks": [
{
"name": "Database connections health check",
"status": "UP",
"data": {
"<default>": "UP"
}
}
]
}
這些地方搭配上 k8s 的功能,後面可以讓佈署容器化服務變得更加簡單便利,是 quarkus 框架一個很獨特的優勢。
說了這麼多 quarkus 的特點,那麼和 ktor 相比,該在什麼時候選擇哪個框架呢?
我認為如果是已知會有高可用性的需求,並且團隊內對於 k8s 已經有一定熟悉程度時,可以透過建立 k8s 腳本搭配 quarkus 框架,來達成多個容器的服務。避免單一容器出現問題時造成用戶無法使用功能的問題。
但是,如果目前服務相對單純,並沒有那麼多的容器需要進行管理,那麼引入 k8s 反而會讓專案維護的複雜度提高。
如果沒有使用 k8s,只是單純建立幾個容器的話,那麼 quarkus 和 Ktor 比較的優點就沒有那麼突出了。這時候我就會選擇使用 Ktor 或其他的後端框架。
今天的部分就到這邊,我們明天見!